import type { Slots } from "vue";
import { getSlot } from "@/utils/slot"
/**
 *
 * @param schema 对应组件数据
 * @returns 返回提示信息对象
 * @description 用于自动设置placeholder
 */
export const setTextPlaceholder = (schema: FormSchema): PlaceholderMoel => {
  const textMap = ["Input", "Autocomplete", "InputNumber", "InputPassword"];
  const selectMap = [
    "Select",
    "TimePicker",
    "DatePicker",
    "TimeSelect",
    "TimeSelect",
  ];
  if (textMap.includes(schema?.component as string)) {
    return {
      placeholder: "請輸入内容",
    };
  }
  if (selectMap.includes(schema?.component as string)) {
    // 一些范围选择器
    const twoTextMap = [
      "datetimerange",
      "daterange",
      "monthrange",
      "datetimerange",
      "daterange",
    ];
    if (
      twoTextMap.includes(
        (schema?.componentProps?.type ||
          schema?.componentProps?.isRange) as string
      )
    ) {
      return {
        startPlaceholder: "开始时间",
        endPlaceholder: "结束时间",
        rangeSeparator: "-",
      };
    } else {
      return {
        placeholder: "请选择",
      };
    }
  }
  return {};
};
/**
 *
 * @param col 内置栅格
 * @returns 返回栅格属性
 * @description 合并传入进来的栅格属性
 */
export const setGridProp = (col: ColProps = {}): ColProps => {
  const colProps: ColProps = {
    // 如果有span，代表用户优先级更高，所以不需要默认栅格
    ...(col.span
      ? {}
      : {
          xs: 24,
          sm: 12,
          md: 12,
          lg: 12,
          xl: 12,
        }),
    ...col,
  };
  return colProps;
};
/**
 *
 * @param item 传入的组件属性
 * @returns 默认添加 clearable 属性
 */
export const setComponentProps = (item: FormSchema): Recordable => {
  const notNeedClearable = ["ColorPicker"];
  const componentProps: Recordable = notNeedClearable.includes(
    item.component as string
  )
    ? { ...item.componentProps }
    : {
        clearable: true,
        ...item.componentProps,
      };
  // 需要删除额外的属性
  delete componentProps?.slots;
  return componentProps;
};
/**
 *
 * @param slots 插槽
 * @param slotsProps 插槽属性
 * @param field 字段名
 */
export const setItemComponentSlots = (
  slots: Slots,
  slotsProps: Recordable = {},
  field: string
): Recordable => {
  const slotObj: Recordable = {};
  for (const key in slotsProps) {
    if (slotsProps[key]) {
      // 由于组件有可能重复，需要有一个唯一的前缀
      slotObj[key] = (data: Recordable) => {
        return getSlot(slots, `${field}-${key}`, data);
      };
    }
  }
  return slotObj;
};
/**
 *
 * @param schema Form表单结构化数组
 * @param formModel FormMoel
 * @returns FormMoel
 * @description 生成对应的formModel
 */
export const initModel = (
  schema: FormSchema[],
  formModel: Recordable
) => {
  const model: Recordable = { ...formModel };
  schema.map((v) => {
    if (v.component !== "Divider") {
      const hasField = Reflect.has(model, v.field);
      // 如果先前已经有值存在，则不进行重新赋值，而是采用现有的值
      model[v.field] = hasField
        ? model[v.field]
        : v.value !== void 0
        ? v.value
        : "";
    }
  });
  return model;
};
/**
 * @param slots 插槽
 * @param field 字段名
 * @returns 返回FormIiem插槽
 */
export const setFormItemSlots = (slots: Slots, field: string): Recordable => {
  const slotObj: Recordable = {};
  if (slots[`${field}-error`]) {
    slotObj["error"] = (data: Recordable) => {
      return getSlot(slots, `${field}-error`, data);
    };
  }
  if (slots[`${field}-label`]) {
    slotObj["label"] = (data: Recordable) => {
      return getSlot(slots, `${field}-label`, data);
    };
  }
  return slotObj;
};
